/*
 * Classe para operações básicas para o banco de dados
 */
package amanda_gabriel_isabella_lucivania_monica.Model.Dao;

import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import javax.persistence.*;

/**
 * Implementação da interface DaoBase
 *
 * @author monica
 */
public class DaoBaseImpl implements DaoBase {

    private static final String PERSISTENCE_UNIT_NAME = "amanda_gabriel_isabella_lucivania_monicaPU";
    private EntityManagerFactory emf = null;

    public DaoBaseImpl() {

        emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

    }

    protected EntityManager getEntityManager() {

        EntityManager em = emf.createEntityManager();
        return (em);

    }

    @Override
    public Object create(Object object) {

        EntityManager em = getEntityManager();

        try {

            em.getTransaction().begin();

            em.persist(object);

            em.getTransaction().commit();


            return (object);

        } finally {
            em.close();
        }

    }

    @Override
    public void update(Object object) {
        EntityManager em = getEntityManager();

        try {

            em.getTransaction().begin();

            object = em.merge(object);

            em.getTransaction().commit();




        } finally {
            em.close();
        }


    }

    @Override
    public void remove(Object object) {
        EntityManager em = getEntityManager();

        try {

            em.getTransaction().begin();

            object = em.merge(object);

            em.remove(object);

            em.getTransaction().commit();

        } finally {
            em.close();
        }
    }

    @Override
    public List<Objects> executarQuery(String stringQuery, List<Integer> objetos, List<String> parametros) {
        EntityManager em = getEntityManager();
        List<Objects> resultado = null;

        try {
            Query query = em.createQuery(stringQuery);

            if ((objetos != null) || (parametros != null)) {

                Iterator<Integer> it1 = objetos.iterator();
                Iterator<String> it2 = parametros.iterator();
                while (it1.hasNext() && it2.hasNext()) {
                    Integer objeto = it1.next();
                    System.out.println("Obj: " + objeto);
                    String parametro = it2.next();
                    System.out.println("Param: " + parametro);
                    query.setParameter(parametro, objeto);
                }

            }

            resultado = (List<Objects>) query.getResultList();

        } catch (EntityNotFoundException notFound) {
            notFound.printStackTrace();
        } catch (NonUniqueResultException nonUnique) {
            nonUnique.printStackTrace();
        }

        return (resultado);
    }
}
